package universe;

public class Board {

	private int[][] matrix; // width, height
	private int width;
	private int height;
	private int blockWidth = Utils.BLOCK_WIDTH;
	private int blockHeight = Utils.BLOCK_HEIGHT;


	public Board (int pWidth,int pHeight){
		assert(pWidth>0 && pHeight>0);
		width = pWidth;
		height= pHeight;
		matrix = new int[width][height];
		/*for ( int j=1 ; j < height; j++){ 
			for ( int i=0 ; i < width; i++){
				matrix[i][j]=1;
			}
		}
		for ( int j=0 ; j < height-1;j++){ 
			for ( int i=1 ; i < width-1;i++){
				matrix[i][j]=0;
			}
		}*/
		
		
		for(int j = 0; j < height;j++){
			matrix[0][j] = 1;
			matrix[width-1][j] = 1;
		}
		for(int i=0; i<width;i++){
			matrix[i][height-1] = 1;
		}
		
		
		
	}

	public int[][] getMatrix() { 
		return matrix; 
	}

	// Positionne un block dans la matrice
	// Note : Aucun test n'est fait ici
	public void pushBlock (Block pBlock,int x, int y){
		for ( int j=0 ; j < blockHeight; j++){ 
			for ( int i=0 ; i < blockWidth; i++){

				if(pBlock.getCell(i, j)!= 0){
					if (x+i < width && y+j < height)
						matrix[x+i][y+j]=pBlock.getCell(i, j);
				}
			}
		}
	}

	// Vérifie si la piece passée en paramètre (pBlock) peut être placée à l'endroit x, y 
	public boolean pushAllowed(Block pBlock,int x, int y){
		
		boolean bAllowed = true;
		
		if(x < -2 || x >= width || y >= height){
			bAllowed = false;
		}

		for ( int j=0 ; j < blockHeight && bAllowed; j++){ 
			for ( int i=0 ; i < blockWidth && bAllowed; i++){
				if(pBlock.getCell(i, j)!= 0){
					if (x+i < width && y+j < height){
						if(matrix[x+i][y+j] != 0){
							// Il y a déjà une pièce...
							bAllowed = false;
						}
					}else{
						// On sort de la matrice...
						bAllowed = false;
					}						
				}
			}			
		}
		return bAllowed;
	}

	public int getWidth() {
		return width;
	}

	public int getHeight() {
		return height;
	}

	public String toString()
	{
		String retour="";

		int[][] matrix = this.getMatrix();
		for(int j=0; j< height;j++)
		{
			for(int i=0; i< width;i++)
			{
				retour = retour + String.valueOf(matrix[i][j]);
			}
			retour = retour + "\n";

		}
		return retour;
	}


	public int detectLowestCompletedLine(int from){

		for(int line=from; line>0; --line){

			int i=1;
			for(; i<width && matrix[i][line]!=0; ++i);

			if(i==width){
				return line;
			}
		}
		return 0;
	}

	public void collapseLine(int line){
		int max = width-1;
		for(int l=line; l>1; --l){
			for(int i=1; i<max; ++i){
				matrix[i][l]=matrix[i][l-1];
			}
		}
	}
}
